package com.proxy.cglib;

import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.core.KeyFactory;

//keyFactory类用来动态生成接口的实例，接口需要只包含一个newInstance方法，返回一个Object。keyFactory为构造出来的实例动态生成了Object.equals和Object.hashCode方法，能够确保相同的参数构造出的实例为单例的。
//使用场景
//需要多个键联合一起组成一个key的
public class KeyFactoryDemo {

	private interface MyFactory {
        public Object newInstance(int a, int b);
    }
    public static void main(String[] args) {
        //这一句是把class文件输出在指定目录
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, ".//");
        MyFactory f = (MyFactory)KeyFactory.create(MyFactory.class);
        MyFactory f1 = (MyFactory)KeyFactory.create(MyFactory.class);
        //1.f和f1的关系，这实际上是用了缓存，缓存了同样的类对象，只不过生成不同的实例
        //2.key1和key2这个组合，是一样的，这是利用KeyFactory实现了equals和hash的方法
        //这样使得这种组合的Key能够用在map和set中
        System.out.println(f == f1);//false
        System.out.println(f.equals(f1));//true
        Object key1 = f.newInstance(20, 30);
        Object key2 = f.newInstance(20, 30);
        Object key3 = f.newInstance(20, 40);

        System.out.println(key1.equals(key2));//true
        System.out.println(key2.equals(key3));//false
    }

}
